\documentclass[12pt, a4paper, oneside]{ctexart}
\usepackage{amsmath, amsthm, amssymb, appendix, bm, graphicx, hyperref, mathrsfs}
\usepackage{enumerate,color,xcolor}
\usepackage{ulem,listings}
\usepackage{booktabs}
\linespread{1.5}
\newtheorem{theorem}{定理}[section]
\newtheorem{definition}[theorem]{定义}
\newtheorem{lemma}[theorem]{引理}
\newtheorem{corollary}[theorem]{推论}
\newtheorem{example}[theorem]{例}
\newtheorem{proposition}[theorem]{命题}
\newcommand\graybg[1]{\colorbox[RGB]{245,245,244}{#1}}
\renewcommand{\abstractname}{\Large\textbf{摘要}}
\lstset{
    % basicstyle          =   \sffamily,          % 基本代码风格
    keywordstyle        =   \bfseries,          % 关键字风格
    backgroundcolor     =   \color[RGB]{245,245,244},
    commentstyle        =   \rmfamily\itshape,  % 注释的风格，斜体
    stringstyle         =   \ttfamily,  % 字符串风格
    flexiblecolumns,                % 别问为什么，加上这个
    numbers             =   left,   % 行号的位置在左边
    showspaces          =   false,  % 是否显示空格，显示了有点乱，所以不现实了
    numberstyle         =   \zihao{-5}\ttfamily,    % 行号的样式，小五号，tt等宽字体
    showstringspaces    =   false,
    captionpos          =   t,      % 这段代码的名字所呈现的位置，t指的是top上面
    frame               =   lrtb,   % 显示边框
}
\begin{document}

\thispagestyle{empty}


% Table generated by Excel2LaTeX from sheet 'Sheet1'
\begin{table}[htbp]
    \centering
    % \caption{Add caption}
      \begin{tabular}{|c|c|c|c|c|}
      \hline
      \multicolumn{5}{|c|}{《数据库原理》实验报告} \\
      \hline
      题目：实验八 & 学号    & 姓名    & 班级    & 日期 \\
      \hline
      数据库综合实验 & 2019302820 & 杨士欣   & 10011901 & 2021.12.11 \\
      \hline
      \end{tabular}%
    \label{tab:addlabel}%
  \end{table}%
  
\vspace*{\fill}
    \begin{center}
        \Huge\textbf{图书管理系统实验报告}
    \end{center}
\vspace*{\fill}

\newpage


\pagenumbering{Roman}
\setcounter{page}{1}
\tableofcontents
\newpage
\setcounter{page}{1}
\pagenumbering{arabic}


% 正文
\section{需求分析}
一个简单的图书管理系统包括图书馆内书籍的信息、学校在校学生的信息以及学生的借阅信息。
此系统功能分为面向学生和面向管理员两部分，
其中面向学生部分可以进行借阅、续借、归还和查询书籍等操作；
面向管理员部分可以完成书籍和学生的增加、删除和修改以及对学生借阅、续借、归还的确认。
    \subsection{学生}
    \begin{enumerate}
    \item 查看馆藏书籍，可以总览，或者依据图书分类浏览，或者通过查询图书名称、作者名称等查找书目。
    \item 借阅、归还图书。查看个人借阅信息。
    \item 注册账号、修改个人信息、登录密码等。
    \end{enumerate}

    \subsection{管理员}
    \begin{enumerate}
        \item 帮助学生借还图书。
        \item 查看所有借阅记录。
        \item 查看馆藏书籍，可以总览，或者依据图书分类浏览，或者通过查询图书名称、作者名称等查找书目。
        \item 进行书籍管理，包括新添加图书、设置图书分类、修改图书信息等。
        \item 注册其他管理员账号
    \end{enumerate}
    
\section{数据流图及数据字典}
    \subsection{数据流图} 
    数据流图如图1和图2所示。
    \begin{figure}[h]
        \centering
        \includegraphics[width=13cm]{../photo/DataStream.png}
        \caption{数据流图}
    \end{figure}
    \begin{figure}[h]
        \centering
        \includegraphics[width=13cm]{../photo/DataStream2.png}
        \caption{细化之后的数据流图}
    \end{figure}
    \newpage
    \subsection{数据字典}
    \begin{enumerate}
        \item 数据流
    
        \begin{enumerate}[(1)]
            \item 个人信息数据流
            \begin{itemize}
                \item \textbf{数据流名}:个人信息。
                \item \textbf{说明}:通过用户名、密码来鉴别登录人员信息。
                \item \textbf{来源去向}:学生 $\rightarrow $安全管理;管理员 $\rightarrow$ 安全管理。
                \item \textbf{数据结构}:用户名+密码，存储在用户信息表中。
            \end{itemize}

            \item 查看请求数据流
            \begin{itemize}
                \item \textbf{数据流名}:查看请求。
                \item \textbf{说明}:通过书名或者作者名或者类别查看馆藏中的图书。
                \item \textbf{来源去向}:学生 $\rightarrow $查看书目;
                \item \textbf{数据结构}:根据类别、书名、作者名等存储在图书信息表中。
            \end{itemize}

            \item 借书信息数据流
            \begin{itemize}
                \item \textbf{数据流名}:借书信息。
                \item \textbf{说明}:根据书号和读者编号，进行借书处理
                \item \textbf{来源去向}:查看书目 $\rightarrow $借书处理;
                \item \textbf{数据结构}:书号和读者编号和借阅日期，存储在借阅记录表中。
            \end{itemize}

            \item 还书请求数据流
            \begin{itemize}
                \item \textbf{数据流名}:还书请求。
                \item \textbf{说明}:根据书号和读者编号，查找相应借阅记录，归还图书并删除借阅记录
                \item \textbf{来源去向}:学生 $\rightarrow $ 还书处理;
                \item \textbf{数据结构}:图书信息表，读者信息表。
            \end{itemize}

            \item 录入信息数据流
            \begin{itemize}
                \item \textbf{数据流名}:录入信息。
                \item \textbf{说明}:管理员根据新添加的书目信息，向系统中录入信息
                \item \textbf{来源去向}:管理员 $\rightarrow $ 图书管理
                \item \textbf{数据结构}:图书信息表。
            \end{itemize}

            \item 注册数据流
            \begin{itemize}
                \item \textbf{数据流名}:注册。
                \item \textbf{说明}:学生在系统中注册用户
                \item \textbf{来源去向}:学生 $\rightarrow $ 读者管理
                \item \textbf{数据结构}:用户信息表
            \end{itemize}
        \end{enumerate}


        \item 数据存储定义
        \begin{enumerate}[(1)]

            \item 图书馆馆藏记录
            \begin{itemize}
                \item \textbf{数据存储名}:图书馆馆藏
                \item \textbf{说明}:记录每一本图书的信息、作者、分类、书号。书号是码
                \item \textbf{输入}:图书管理
                \item \textbf{输出}:查看数目
                \item \textbf{数据描述}:书号、类别、出版社、作者、书名、剩余库存、馆藏地点。
                \item \textbf{数据量}:大约50条（仅限本实验测试数据）。
                \item \textbf{存取频度}:平均一天100次。
                \item \textbf{存取方式}:检索、更新。主要是随机检索。
            \end{itemize}

            \item 读者记录
            \begin{itemize}
                \item \textbf{数据存储名}:读者记录
                \item \textbf{说明}:记录每一个读者的信息，包括读者编号、姓名、学院。
                \item \textbf{输入}:读者管理
                \item \textbf{输出}:借书处理、还书处理
                \item \textbf{数据描述}:编号、姓名、学院。
                \item \textbf{数据量}:大约50条（仅限本实验测试数据）。
                \item \textbf{存取频度}:平均一天100次。
                \item \textbf{存取方式}:检索、更新。主要是随机检索。
            \end{itemize}

            \item 借阅记录
            \begin{itemize}
                \item \textbf{数据存储名}:借阅记录
                \item \textbf{说明}:记录借书换书情况。读者编号和书号为外码。
                \item \textbf{输入}:还书、借书请求。
                \item \textbf{输出}:还书、借书请求。
                \item \textbf{数据描述}:读者编号、图书编号、借阅日期。
                \item \textbf{数据量}:大约50条（仅限本实验测试数据）。
                \item \textbf{存取频度}:平均一天100次。
                \item \textbf{存取方式}:主要是更新。随机检索。
            \end{itemize}

            \item 用户信息
            \begin{itemize}
                \item \textbf{数据存储名}:用户信息
                \item \textbf{说明}:记录用户的信息，主要是用于区分管理员和学生。
                \item \textbf{输入}:安全管理
                \item \textbf{输出}:安全管理
                \item \textbf{数据描述}:用户编号、密码、级别
                \item \textbf{数据量}:大约50条（仅限本实验测试数据）。
                \item \textbf{存取频度}:平均一天100次。
                \item \textbf{存取方式}:主要操作是检索，偶尔会更新。
            \end{itemize}
        \end{enumerate}

        \item 数据处理过程
        \begin{enumerate}[(1)]

            \item 查看书目
            \begin{itemize}
                \item \textbf{处理过程名}:查看书目
                \item \textbf{说明}:根据读者或者管理员发起的请求，对图书信息进行查询、显示。
                \item \textbf{输入}:查看请求，图书馆藏纪录。
                \item \textbf{输出}:查看请求，借书信息。
            \end{itemize}

            \item 借书处理
            \begin{itemize}
                \item \textbf{处理过程名}:借书处理
                \item \textbf{说明}:根据读者的编号、图书号进行借书手续办理
                \item \textbf{输入}:借书信息、读者记录。
                \item \textbf{输出}:借阅记录。
            \end{itemize}

            \item 还书处理
            \begin{itemize}
                \item \textbf{处理过程名}:还书处理
                \item \textbf{说明}:根据读者的编号、图书号进行还书书手续办理
                \item \textbf{输入}:还书请求、借阅记录、读者记录。
                \item \textbf{输出}:借阅记录。
            \end{itemize}

            \item 图书管理
            \begin{itemize}
                \item \textbf{处理过程名}:图书管理
                \item \textbf{说明}:根据管理员录入的图书信息，对馆藏图书信息进行添加、删除、修改等。
                \item \textbf{输入}:录入信息
                \item \textbf{输出}:图书馆藏记录
            \end{itemize}

            \item 读者管理
            \begin{itemize}
                \item \textbf{处理过程名}:读者管理
                \item \textbf{说明}:根据学生录入的信息，进行学生账号的注册。
                \item \textbf{输入}:注册。
                \item \textbf{输出}:读者记录。
            \end{itemize}
        \end{enumerate}
    \end{enumerate}

    \section{ER图}
    ER图如图3所示：
    \begin{figure}[h]
        \centering
        \includegraphics[width=13cm]{../photo/ER.png}
        \caption{ER图}
    \end{figure}

    \newpage
    \section{关系模式设计}
    \subsection{基本设计}
    根据以上ER图以及数据流图、数据字典可得如下关系模式设计：
    \begin{itemize}
        \item \textbf{学生}:\{\underline{编号}，密码，姓名，学院，手机号 \}
        \begin{itemize}
            \item 约束\\
                密码非空\\
                姓名非空\\
                手机号非空
            
            \item 函数依赖\\
            编号$\rightarrow$密码\\
            编号$\rightarrow$姓名\\
            编号$\rightarrow$学院\\
            编号$\rightarrow$手机号\\

        \end{itemize}
        

        \item \textbf{图书}:\{\underline{编号}，书名，作者，类别，出版社，剩余存量，总存量，馆藏地点 \}
        \begin{itemize}
            \item 约束\\
            书名非空\\作者非空\\类别非空\\出版社非空\\剩余存量非空、大于等于零\\库存非空、大于等于剩余存量\\馆藏地点非空

            
            \item 函数依赖\\
            编号$\rightarrow$书名\\
            编号$\rightarrow$作者\\
            编号$\rightarrow$类别\\
            编号$\rightarrow$出版社\\
            编号$\rightarrow$剩余存量\\
            编号$\rightarrow$总存量\\
            编号$\rightarrow$馆藏地点\\

        \end{itemize}
        \item \textbf{管理员信息}:\{\underline{编号}，密码 \}
        \begin{itemize}
            \item 约束\\
            密码非空

            \item 函数依赖\\
            编号$\rightarrow$密码\\
        \end{itemize}

        \item \textbf{学生信息}:\{\underline{编号}，密码 \}
        \begin{itemize}
            \item 约束\\
            密码非空

            \item 函数依赖\\
            编号$\rightarrow$密码\\
        \end{itemize}

        \item \textbf{借阅记录}:\{\underline{ \uwave{学生编号}，\uwave{图书编号}，借阅日期，归还日期} \}
        \begin{itemize}
            \item 约束\\
            密码非空\\
        图书编号参照图书表中的编号\\
            学生编号参照学生表中的编号。

            \item 函数依赖\\
            （学生编号，图书编号，借阅日期）$\rightarrow$截止日期
        \end{itemize}



    \end{itemize}
    容易证明上面的关系模式符合3NF。

    \subsection{数据库表设计}
    数据库中建立的具体的表的结构如下：
    \begin{enumerate}
        \item 学生表student，属性名分别是number（学生编号），pwd（密码）
        name（姓名），dept（学院），phone\_number（手机号）。
        \item 图书表books，属性名分别是number（书号），name（书名），author（作者）
        category（分类），publish（出版社），repertory（库存），total\_mount（总量），location（位置）。
        \item 借书记录rent\_record，属性名分别是student\_number（学生号），book\_number（书号），
        rent\_date（借阅日期），ddl（到期时间）。
        \item 管理员表admin\_info，属性名分别是admin\_number（管理员编号），admin\_pwd（密码）。
    \end{enumerate}
    上述表中的约束与关系模式设计中的设置相同。

    \subsection{存储过程}
    \subsubsection{借书存储过程}

    \begin{itemize}
        \item \textbf{存储过程名称}：rent\_book
        \item \textbf{输入}：读者号，书号
        \item \textbf{过程描述}：根据书号，扣除books表中库存量，然后根据书号和学生号生成一条借书记录存入rent\_record表中。
        \item \textbf{源码}：
\begin{lstlisting}[basicstyle=\scriptsize]
CREATE  PROCEDURE `rent_book`(
in stu_num varchar(45),
in book_num varchar(45))
BEGIN

    -- decrese book repertory
update books set repertory = repertory-1
	where number=book_num;
    -- add rent record 
insert into 
    rent_record(student_number,book_number,
        rent_date,ddl)

	values(stu_num,book_num,now(),
        date_add(now(),interval 30 day));
END
        \end{lstlisting}
    \end{itemize}

    \subsubsection{还书存储过程}

    \begin{itemize}
        \item \textbf{存储过程名称}：return\_book
        \item \textbf{输入}：读者号，书号
        \item \textbf{过程描述}：根据书号和学生号删去rent\_record表中对应的存储记录。然后根据书号，添加books表中库存量。
        \item \textbf{源码}：
\begin{lstlisting}[basicstyle=\scriptsize]
CREATE  PROCEDURE `return_book`(
    in stu_num varchar(45),
    in book_num varchar(45),
    in indate datetime
    )
    BEGIN
    -- remove rent record
    delete from rent_record where 
        student_number=stu_num and book_number=book_num and rent_date=indate;
    -- add book repertory
    update books set repertory = repertory + 1 where number=book_num;
    END
        \end{lstlisting}
    \end{itemize}
\subsection{索引设计}
\begin{enumerate}
    \item 书名索引\\
    同学们查询往往根据书名进行查询，因此可以建立books表中关于书名的全文索引，可以提高查询效率。

    \item 学生名索引\\
    管理员对学生进行修改信息时，需要对学生姓名进行搜索。因此建议student表中关于学生名的全文索引，提高查询效率。
\end{enumerate}
    
\section{代码说明}
\subsection{项目特点}
\begin{itemize}
    \item GUI图形界面
    \item 支持验证码
    \item 支持管理员、学生两种用户登录
    \item 支持学生进行账号注册
    \item 可以找回密码
\end{itemize}
\subsection{项目目录结构}
\begin{itemize}
    \item project 文件夹下是整个项目。
    \item project/src是代码源文件
    \item project/src/UI下面的文件是分别是通用界面文件、学生用户相关界面目录student，管理员用户相关界面目录admin。
\end{itemize}

\subsection{开发环境}
\begin{itemize}
    \item 使用C\#语言，winform搭建GUI界面。
    \item 使用VS2019进行开发，需要支持.Net Framework v4.7.2
    \item 需要MySQL8.0及以上
\end{itemize}
\subsection{使用说明}
\begin{enumerate}
    \item MySQL配置\\
    需要在本地MySQL中新建一个用户，用户名为nwpu，密码为nwpuDB2021，并赋予全部权限如下图。
    
    \begin{figure}[h]
        \centering
        \includegraphics[width=13cm]{../photo/configMySQL.png}
        \caption{MySQL中配置用户权限}
    \end{figure}
    代码中SQL连接语句在project/src/SqlHelper.cs中,如图5中所示。
    \begin{figure}[h]
        \centering
        \includegraphics[width=13cm]{../photo/codeSQL.png}
        \caption{src/SqlHelper.cs中有关连接的代码}
    \end{figure}

    \item 数据库配置\\
    直接导入目录下的\graybg{大作业数据库备份.sql}即可。

    \item 登录\\
    提供了两个简单账号，分别如下：
    \begin{itemize}
        \item 管理员登录：账号123，密码123。
        \item 学生登陆：账号2019302820，密码123456。
    \end{itemize}
\end{enumerate}



\section{开发中的问题}
\begin{enumerate}
    \item GUI界面\\
    对我来说，这应该是第一次写GUI界面的软件。之前感觉GUI很高级，很不好写，
    搜索过一些资料，加上老师上课讲解之后，基本锁定使用winform完成这个不算很大的
    数据库大作作业。winform简单易上手，特别适合完成这种较小项目。
    而且它对应的开发语言时C\#，语法与JAVA非常类似，使用起来也不会有太多问题。
    而且实操起来，在Visual Studio中可以很方便的使用拖拉控件来开发图形界面。

    \item 界面逻辑\\
    实际上敲定使用winform之后，图形界面开发中还是遇到了很多问题。
    因为是第一次开发图形界面，对于界面、弹窗等交互逻辑需要学习设计思路，
    此外一个好的界面界面排版也需要学习。这个问题通过网上查找资料，学习开源代码的
    书写思路解决掉。

    \item 多用户模式登录
    本次实验需要提供两个用户登录模式，分别是管理员和普通学生。这是我第一次设计这种
    模式，而且怎么与数据库连接也是个问题。经过查询资料、思考之后，通过设置
    管理员表和学生表来检测权限。另外通过一个其他账号登录数据库解决掉了这个问题。

\section{总结与感悟}
通过本次实验，我第一次亲手开发了一个拥有图形界面、连接后台数据库、功能比较完整的软件。
在这个过程中，我不只了解到了怎么开发一个图形界面、怎么在软件开发中将数据库和业务逻辑有机结合起来，
更重要的是，在这其中我亲自感受了如何组织一个软件项目，怎么组织自己的代码结构，让层与层之间
清晰明了，有效进行软件项目目有序开发。而且通过完整按照课本开发流程进行大作业设计，我感受了
这种自顶而下，从需求、到数据流、到关系模式设计、再到代码的编写这种开发方式的思路之顺畅，
开发之高效。

此外，在学习过程中，我体会到了开源的魅力，借助开源控件库，我可以很快搭建出一个比较美观的GUI界面。
通过学习别人的代码，我可以了解别人优秀的代码组织方式，从而提高自己的编码能力。

    
\end{enumerate}
\newpage
\begin{thebibliography}{99}
王珊. 数据库系统概论[M]. 2014年9月第5版. 北京:高等教育出版社, 1983年4月.

\end{thebibliography}

% \newpage

% \begin{appendices}
%     \renewcommand{\thesection}{\Alph{section}}
%     \section{附录标题}
%         这里是附录.
% \end{appendices}

\end{document}